//
//  main.c
//  模拟实现atoi
//
//  Created by 卜绎皓 on 2022/5/11.
//

//atoi    将一个字符串转化为一个整型
/**
 特殊情况
 1前面有一大堆空格
 2传过来空指针
 3字符串长度为0
 4整形溢出
 5含有其它字符
 */
 
#include<stdio.h>
#include<assert.h>
#include<limits.h>
#include<ctype.h>
enum state
{
    VALID,//合法
    INVALID//非法
};
enum state statue = INVALID;
int my_atoi(const char*str)
{
    assert(str);
    char* p = (char*)str;
    long long n = 0;
    int flag = 1;
    //字符串长度为0
    if (*str == '\0')
    {
        return 0;
    }
    //字符串前面有很多空格
    while (*p == ' ')
    {
        p++;
    }
    //判断符号
    if (*p == '+')
    {
        flag = 1;
        p++;
    }
    else if (*p == '-')
    {
        flag = -1;
        p++;
    }
    //开始计算
    while (*p!='\0')
    {
        if (isdigit(*p))
        {
            n = n * 10 + flag * (*p - '0');
            if (n >INT_MAX)
            {
                n = INT_MAX;
                break;
            }
            else if (n < INT_MIN)
            {
                n = INT_MIN;
                break;
            }
        }
        else
        {
            break;
        }
        p++;
    }
    if (*p == '\0')
    {
        statue = VALID;
    }
    return (int)n;
}
int main()
{
    char arr[] = "12345678";
    int m = my_atoi(arr);
    if (statue == VALID)
    {
        printf("%d\n", m);
    }
    if (statue == INVALID)
    {
        printf("非法转化\n");
    }
    return 0;
}

